﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using Studio7i.Dominio;
using Studio7i.Negocio;
using Studio7i.Persistencia;




namespace Studio7i.Pruebas
{
    [TestFixture]
    public class TestAdministracion1cs
    {
        IApplicationContext Spring = null;
        IAdministracionService Service = null;
        Local localCreado = null;
        Sala salaInscrita = null;
        Cliente clienteInscrita = null;
        Instrumento instCreado = null;


        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // Inicialización del contenedor de objetos de Spring.NET
            Spring = new XmlApplicationContext(
                "assembly://Studio7i/Studio7i/CapaPersistencia.xml",
                "assembly://Studio7i/Studio7i/CapaNegocio.xml"
                );

            // Obtención de la referencia al objeto "administracionService"
            Service = (IAdministracionService)Spring.GetObject("administracionService");


            // Creación de un local de pruebas
            localCreado = ((ILocalDAO)Spring.GetObject("localDAO_ADO")).Crear(
                new Local() { CodLocal = 11, Direccion = "Bailety 155", Distrito = "San Borja" });


            // Creación de un instrumento de pruebas
            instCreado = ((IInstrumentoDAO)Spring.GetObject("instrumentoDAO_ADO")).Crear(
            new Instrumento() { Tipo = "Bateria", Marca = "Yamaha", Modelo = "N43", FechFabricacion = DateTime.ParseExact("2009", "yyyy", null), Caracteristicas = "Bateria de última    generación", CostoHora = 9, Estado = true });

            // CREACION DE UNA SALA PARA PRUEBAS
            // salaInscrita = ((ISalaDAO)Spring.GetObject("salaDAO_ADO")).Crear(
            //new Sala() { nombre = "E43A Rocks!", localcodigo = 10, Capacidad = 30, caracteristicas = ".NET Students" });
            // Service.InscribirSala("E43A Rocks!", localCreado.CodLocal, 30, ".NET Students");
        }

        // prueba para detectar si hay datos incompletos en isntrumento, no hay dato en el costo por hora
        [Test]
        public void InstrumentoDatosIncompletos()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarInstrumento("Guitarra", "YCA", "N67", DateTime.ParseExact("2009", "yyyy", null), "Eléctrica", 0, true);
            });

        }

        [Test]
        public void ClienteDatosIncompletos()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarCliente(3, null, "df", "12345678", "Mi", "montanchez", "m@hot", DateTime.ParseExact("2009", "yyyy", null));


            });

        }


        // prueba para registrar un instrumento ok,se tiene q verificar q tengan la misma data, y que el codigo sea mayor de 0
        [Test]
        public void InstrumentoCreadoOK()
        {
            Assert.DoesNotThrow(delegate
            {
                instCreado = Service.RegistrarInstrumento("Bajo", "CASIO", "OP32", DateTime.ParseExact("2009", "yyyy", null), "Bajo con 5 cuerdas", 40, true);
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(instCreado);

            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(instCreado.CodInst, 0);

            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(instCreado.Tipo, "Bajo");
            Assert.AreEqual(instCreado.Marca, "CASIO");
            Assert.AreEqual(instCreado.Modelo, "OP32");
            Assert.AreEqual(instCreado.FechFabricacion, "2009");
            Assert.AreEqual(instCreado.Caracteristicas, "Bajo con 5 cuerdas");
            Assert.AreEqual(instCreado.CostoHora, "40");
            Assert.AreEqual(instCreado.Estado, true);
        }





        [Test]
        public void Test1_InscribirSala_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.CodLocal, 30, null);
            });

        }

        [Test]
        public void Test_InscribirCliente_Ok()
        {
            // Probamos que no exista error en la inscripción de la sala
            Assert.DoesNotThrow(delegate
            {
                clienteInscrita = Service.RegistrarCliente(3, "rrr", "456", "12345678", "MI", "GALINDO", "m@hot", DateTime.ParseExact("2009", "yyyy", null));



            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(clienteInscrita);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(clienteInscrita.CodUser, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            //Assert.AreEqual(clienteInscrita.CodUser, 3);
            Assert.AreEqual(clienteInscrita.NombreUsuario, "rrr");
            Assert.AreEqual(clienteInscrita.Clave, "456");
            Assert.AreEqual(clienteInscrita.DNI, "12345678");
            Assert.AreEqual(clienteInscrita.Nombres, "MI");
            Assert.AreEqual(clienteInscrita.Apellidos, "GALINDO");
            Assert.AreEqual(clienteInscrita.Email, "m@hot");

            Assert.AreEqual(clienteInscrita.FechaNac, DateTime.ParseExact("2009", "yyyy", null));
        }
        [Test]


        public void Test2_InscribirSala_Ok()
        {
            // Probamos que no exista error en la inscripción de la sala
            Assert.DoesNotThrow(delegate
            {
                salaInscrita = Service.InscribirSala("E43A Rocks!", 7, 30, ".NET Students");
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(salaInscrita);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(salaInscrita.CodSala, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(salaInscrita.Nombre, "E43A Rocks!");
            Assert.AreEqual(salaInscrita.Local.CodLocal, localCreado.CodLocal);
            Assert.AreEqual(salaInscrita.Capacidad, 30);
            Assert.AreEqual(salaInscrita.Caracteristicas, ".NET Students");
        }
        [Test]




        public void Test3_InscribirSala_Repetida()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.CodLocal, 30, ".NET Students");
            });
        }
        //[TestFixtureTearDown]

        //public void FinalizarPruebas()
        //{
        //    // Eliminamos la sala inscrita
        //    ((ISalaDAO)Spring.GetObject("salaDAO_ADO")).Eliminar(salaInscrita);
        //    // Eliminamos el local de prueba creado inicialmente
        //    ((ILocalDAO)Spring.GetObject("localDAO_ADO")).Eliminar(localCreado);
        //    // Cerramos el contenedor de Spring
        //    Spring.Dispose();
        //    Spring = null;
        //}
    }
}
